home *** CD-ROM | disk | FTP | other *** search
Text File | 1994-11-01 | 6.8 KB | 261 lines | [TEXT/MPCC] |
- // { WASTE PROJECT: }
- // { Embedded Objects }
-
- // { Copyright © 1993-1994 Marco Piovanelli }
- // { All Rights Reserved }
-
- #include "WASTEIntf.h"
-
- extern WELookupTable *_WEObjectHandlerSelectorTable;
-
- const short kUnknownObjectType = -1; // { specifies an object type for which no handlers are installed }
- const Point kDefaultObjectSize = {32, 32}; // { default object size (32x32 pixels) }
-
- typedef struct WEOHTableElement {
- OSType objectType; // { 4-letter tag identifying object type }
- WENewObjectProcPtr newHandler;
- WEDisposeObjectProcPtr freeHandler;
- WEDrawObjectProcPtr drawHandler;
- ProcPtr clickHandler;
- ProcPtr cursorHandler;
- } WEOHTableElement, *WEOHTableElementPtr, *WEOHTable, **WEOHTablePtr, ***WEOHTableHandle;
-
- // { static variables }
-
- static WEOHTableHandle sHandlerTable;
- static short sHandlerCount;
-
- pascal OSType WEGetObjectType(WEObjectDescHandle hObjectDesc)
- {
- return (*hObjectDesc)->objectType;
- } // { WEGetObjectType }
-
- pascal Handle WEGetObjectDataHandle(WEObjectDescHandle hObjectDesc)
- {
- return (*hObjectDesc)->objectDataHandle;
- } // { WEGetObjectDataHandle }
-
- pascal Point WEGetObjectSize(WEObjectDescHandle hObjectDesc)
- {
- return (*hObjectDesc)->objectSize;
- } // { WEGetObjectSize }
-
- pascal WEHandle WEGetObjectOwner(WEObjectDescHandle hObjectDesc)
- {
- return (*hObjectDesc)->objectOwner;
- } // { WEGetObjectOwner }
-
- pascal long WEGetObjectRefCon(WEObjectDescHandle hObjectDesc)
- {
- return (*hObjectDesc)->objectRefCon;
- } // { WEGetObjectRefCon }
-
- pascal void WESetObjectRefCon(WEObjectDescHandle hObjectDesc, long refCon)
- {
- (*hObjectDesc)->objectRefCon = refCon;
- } // { WESetObjectRefCon }
-
- pascal short _WELookupObjectType(OSType objectType)
- {
-
- // { look for a WEOHTableElement record for the specified object kind }
- // { in our private object handler table }
-
- WEOHTablePtr pTable;
- short index;
-
- // { do nothing if the Object Handler Table has not been inited yet }
- if (sHandlerTable == nil) return kUnknownObjectType;
-
- // { scan the Object Handler Table looking for a type match }
- pTable = *sHandlerTable;
- for (index = sHandlerCount - 1; index>=0; index--)
- {
- if ((*pTable)[index].objectType == objectType)
- return index;
- }
-
- return kUnknownObjectType;
- } // { _WELookupObjectType }
-
- pascal OSErr _WEGetIndObjectType(short index, OSType *objectType)
- {
- objectType = 0L;
-
- if (index >= 0 && index < sHandlerCount)
- {
- *objectType = (**sHandlerTable)[index].objectType;
- return noErr;
- }
- return weUnknownObjectTypeErr;
- } // { _WEGetIndObjectType }
-
- pascal OSErr _WENewObject(OSType objectType, Handle objectDataHandle, WEHandle hWE,
- WEObjectDescHandle *hObjectDesc)
- {
- WEObjectDescPtr pDesc;
- short index;
- OSErr err;
-
- hObjectDesc = nil;
-
- // { look up the specified object type in the handler table }
- index = _WELookupObjectType(objectType);
-
- // { create a new relocatable block to hold the object descriptor }
- err = _WEAllocate(sizeof(WEObjectDesc), kAllocClear, (Handle *)&hObjectDesc);
- if (err != noErr) return err;
-
- // { lock it down }
- HLock((Handle)hObjectDesc);
- pDesc = (WEObjectDescPtr)*hObjectDesc;
-
- // { fill in the object descriptor }
- pDesc->objectType = objectType;
- pDesc->objectDataHandle = objectDataHandle;
- pDesc->objectSize = kDefaultObjectSize;
- pDesc->objectIndex = index;
- pDesc->objectOwner = hWE;
-
- if (index >= 0)
- {
- // { call the new handler, if any }
- if ((**sHandlerTable)[index].newHandler != nil)
- {
- err = (*(*sHandlerTable)[index]->newHandler)(*hObjectDesc, &pDesc->objectSize);
- if (err != noErr)
- {
- _WEForgetHandle((Handle *)&hObjectDesc);
- return err;
- }
- }
- }
-
- // { unlock the object descriptor }
- HUnlock((Handle)hObjectDesc);
-
- // { clear result code }
- return noErr;
- } // { _WENewObject }
-
- pascal OSErr _WEFreeObject(WEObjectDescHandle hObjectDesc)
- {
- WEObjectDescPtr pDesc;
- OSErr retval;
-
- retval = noErr;
-
- // { sanity check: do nothing if we have a null descriptor handle }
- if (hObjectDesc == nil)
- return nilHandleErr;
-
- // { lock the descriptor record }
- HLock((Handle)hObjectDesc);
- pDesc = *hObjectDesc;
-
- if (pDesc->objectIndex >= 0)
- {
- // {$IFC WASTE_DEBUG}
- // { sanity check: make sure object kind matches handler kind }
- // _WEAssert(pDesc->objectType = objectType, 'Object Type Mismatch');
- // {$ENDC}
-
- // { call the dispose handler, if any }
- if ((**sHandlerTable)[pDesc->objectIndex].freeHandler != nil)
- {
- retval = (*(**sHandlerTable)[pDesc->objectIndex].freeHandler)(hObjectDesc);
- pDesc->objectDataHandle = nil;
- }
- }
-
- // { if object kind is unknown or there's no custom dispose handler, use DisposeHandle }
- _WEForgetHandle(&pDesc->objectDataHandle);
-
- // { finally, dispose of the object descriptor itself }
- DisposeHandle((Handle)hObjectDesc);
-
- return retval;
- } // { _WEFreeObject }
-
- pascal OSErr _WEDrawObject(WEObjectDescHandle hObjectDesc)
- {
- WEObjectDescPtr pDesc;
- Point thePen;
- Rect destRect;
- OSErr retval = noErr;
-
- // { the pen has already been set to the bottom left of the rectangle to draw }
- GetPen(&thePen);
-
- pDesc = *hObjectDesc;
-
- // { calculate the destination rectangle }
- destRect.top = thePen.v - pDesc->objectSize.v;
- destRect.left = thePen.h;
- destRect.bottom = thePen.v;
- destRect.right = thePen.h + pDesc->objectSize.h;
-
- // { calculate the new pen position }
- thePen.h = thePen.h + pDesc->objectSize.h;
-
- if (pDesc->objectIndex >= 0)
- {
- // {$IFC WASTE_DEBUG}
- // { sanity check: make sure object kind matches handler kind }
- // _WEAssert(pDesc->objectType = objectType, 'Object Type Mismatch');
- // {$ENDC}
-
- // { call the drawing handler, if any }
- if ((**sHandlerTable)[pDesc->objectIndex].drawHandler != nil)
- retval = (*(**sHandlerTable)[pDesc->objectIndex].drawHandler)(&destRect, hObjectDesc);
- }
-
- // { advance the pen position }
- MoveTo(thePen.h, thePen.v);
-
- return retval;
- } // { _WEDrawObject }
-
- pascal OSErr WEInstallObjectHandler(OSType objectType, OSType handlerSelector, ProcPtr handler)
- {
- short index;
- WEOHTableElement element;
- OSErr err;
-
- // { create the handler table, if it doesn't exist }
- if (sHandlerTable == nil)
- {
- sHandlerTable = (WEOHTableHandle)NewHandle(0);
- err = MemError();
- if (err != noErr)
- return err;
- }
-
- // { look for an object handler record for the specified object type }
- index = _WELookupObjectType(objectType);
-
- if (index == kUnknownObjectType)
- {
-
- // { previously unknown object kind: add a new element to the handler table }
- _WEBlockClr((Ptr)&element, sizeof(element));
- element.objectType = objectType;
- index = sHandlerCount;
- err = _WEInsertSlot((Handle)sHandlerTable, (Ptr)&element, index, sizeof(element));
- if (err != noErr)
- return err;
-
- // { increment handler count }
- sHandlerCount = index + 1;
-
- }
-
- // { install the handler }
- err = _WESetField(_WEObjectHandlerSelectorTable, handlerSelector, (long *)&handler,
- (void *)&(*sHandlerTable)[index]);
-
- // { return result code }
- return err;
-
- } // { WEInstallObjectHandler }
-